package com.zenithmind.mall.service;

import com.zenithmind.common.result.PageResult;
import com.zenithmind.mall.pojo.dto.SubsidyProductDTO;
import com.zenithmind.mall.pojo.query.SubsidyProductQuery;
import com.zenithmind.mall.pojo.vo.SubsidyProductVO;

import java.math.BigDecimal;
import java.util.List;

/**
 * 百亿补贴商品服务接口 - 遵循接口隔离原则，专门负责补贴商品管理
 * 
 * @author ZenithMind Team
 * @since 2025-07-03
 */
public interface SubsidyProductService {

    /**
     * 分页查询补贴商品
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<SubsidyProductVO> getSubsidyProductPage(SubsidyProductQuery query);

    /**
     * 根据ID获取补贴商品详情
     * 
     * @param id 补贴商品ID
     * @return 商品详情
     */
    SubsidyProductVO getSubsidyProductById(String id);

    /**
     * 根据活动ID获取补贴商品列表
     * 
     * @param activityId 活动ID
     * @return 补贴商品列表
     */
    List<SubsidyProductVO> getSubsidyProductsByActivity(String activityId);

    /**
     * 添加补贴商品
     * 
     * @param subsidyProductDTO 补贴商品信息
     * @return 补贴商品ID
     */
    String addSubsidyProduct(SubsidyProductDTO subsidyProductDTO);

    /**
     * 更新补贴商品
     * 
     * @param id 补贴商品ID
     * @param subsidyProductDTO 补贴商品信息
     * @return 是否成功
     */
    Boolean updateSubsidyProduct(String id, SubsidyProductDTO subsidyProductDTO);

    /**
     * 删除补贴商品
     * 
     * @param id 补贴商品ID
     * @return 是否成功
     */
    Boolean deleteSubsidyProduct(String id);

    /**
     * 批量添加补贴商品
     * 
     * @param activityId 活动ID
     * @param subsidyProductDTOs 补贴商品信息列表
     * @return 是否成功
     */
    Boolean batchAddSubsidyProducts(String activityId, List<SubsidyProductDTO> subsidyProductDTOs);

    /**
     * 启用/禁用补贴商品
     * 
     * @param id 补贴商品ID
     * @param enabled 是否启用
     * @return 是否成功
     */
    Boolean updateSubsidyProductStatus(String id, Boolean enabled);

    /**
     * 开始补贴商品
     * 
     * @param id 补贴商品ID
     * @return 是否成功
     */
    Boolean startSubsidyProduct(String id);

    /**
     * 结束补贴商品
     * 
     * @param id 补贴商品ID
     * @return 是否成功
     */
    Boolean endSubsidyProduct(String id);

    /**
     * 检查商品是否可以享受补贴
     * 
     * @param id 补贴商品ID
     * @param quantity 购买数量
     * @return 是否可以享受补贴
     */
    Boolean canSubsidy(String id, Integer quantity);

    /**
     * 检查用户是否可以购买补贴商品
     * 
     * @param id 补贴商品ID
     * @param userId 用户ID
     * @param quantity 购买数量
     * @return 是否可以购买
     */
    Boolean canUserBuy(String id, String userId, Integer quantity);

    /**
     * 获取用户已购买数量
     * 
     * @param id 补贴商品ID
     * @param userId 用户ID
     * @return 已购买数量
     */
    Integer getUserBoughtCount(String id, String userId);

    /**
     * 计算补贴金额
     * 
     * @param id 补贴商品ID
     * @param quantity 购买数量
     * @return 补贴金额
     */
    BigDecimal calculateSubsidyAmount(String id, Integer quantity);

    /**
     * 使用补贴库存
     * 
     * @param id 补贴商品ID
     * @param quantity 使用数量
     * @return 是否成功
     */
    Boolean useSubsidyStock(String id, Integer quantity);

    /**
     * 恢复补贴库存
     * 
     * @param id 补贴商品ID
     * @param quantity 恢复数量
     * @return 是否成功
     */
    Boolean restoreSubsidyStock(String id, Integer quantity);

    /**
     * 获取热门补贴商品
     * 
     * @param limit 限制数量
     * @return 热门补贴商品列表
     */
    List<SubsidyProductVO> getHotSubsidyProducts(Integer limit);

    /**
     * 获取推荐补贴商品
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 推荐补贴商品列表
     */
    List<SubsidyProductVO> getRecommendSubsidyProducts(String userId, Integer limit);

    /**
     * 根据分类获取补贴商品
     * 
     * @param categoryId 分类ID
     * @param limit 限制数量
     * @return 补贴商品列表
     */
    List<SubsidyProductVO> getSubsidyProductsByCategory(String categoryId, Integer limit);

    /**
     * 搜索补贴商品
     * 
     * @param keyword 关键词
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 搜索结果
     */
    PageResult<SubsidyProductVO> searchSubsidyProducts(String keyword, Integer pageNum, Integer pageSize);

    /**
     * 预热补贴商品（提前加载到缓存）
     * 
     * @param id 补贴商品ID
     * @return 是否成功
     */
    Boolean warmUpSubsidyProduct(String id);

    /**
     * 批量预热补贴商品
     * 
     * @param activityId 活动ID
     * @return 是否成功
     */
    Boolean batchWarmUpSubsidyProducts(String activityId);

    /**
     * 批量处理补贴商品状态
     * 
     * @return 处理数量
     */
    Integer batchUpdateSubsidyProductStatus();
}
